package com.ctaa.ctaa.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Objects;

public class MD5Utils {

    /**
     * 普通 MD5 加密（32 位小写）
     */
    public static String encrypt(String plainText) {
        try {
            // 获取 MD5 实例
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 转换为字节数组并计算哈希值
            byte[] hashBytes = md.digest(plainText.getBytes());
            // 转换为十六进制字符串
            return bytesToHex(hashBytes);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 算法不可用", e);
        }
    }

    /**
     * 带盐值的 MD5 加密
     */
    public static String encryptWithSalt(String plainText, String salt) {
        return encrypt(plainText + salt);
    }

    /**
     * 生成 16 位 MD5（取 32 位的中间部分）
     */
    public static String encryptTo16Bit(String plainText) {
        String md5 = encrypt(plainText);
        return md5.substring(8, 24);
    }

    /**
     * 验证 MD5 是否匹配
     */
    public static boolean verify(String plainText, String encryptedText) {
        return Objects.equals(encrypt(plainText), encryptedText);
    }

    /**
     * 验证带盐值的 MD5
     */
    public static boolean verifyWithSalt(String plainText, String salt, String encryptedText) {
        return Objects.equals(encryptWithSalt(plainText, salt), encryptedText);
    }

    /**
     * 字节数组转十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = String.format("%02x", b);
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static void main(String[] args) {
        String text = "Hello, World!";
        String salt = "randomSalt123";

        System.out.println("普通 MD5: " + encrypt(text));
        System.out.println("带盐值 MD5: " + encryptWithSalt(text, salt));
        System.out.println("16 位 MD5: " + encryptTo16Bit(text));
        System.out.println("验证结果: " + verify(text, encrypt(text)));

        System.out.println("1111111111111111111111111111111111");

        System.out.println("普通 MD5: " + encrypt(text));
        System.out.println("带盐值 MD5: " + encryptWithSalt(text, salt));
        System.out.println("16 位 MD5: " + encryptTo16Bit(text));
        System.out.println("验证结果: " + verify(text, encrypt(text)));

        System.out.println("2222222222222222222222222222222222222222");

        System.out.println("普通 MD5: " + encrypt(text));
        System.out.println("带盐值 MD5: " + encryptWithSalt(text, salt));
        System.out.println("16 位 MD5: " + encryptTo16Bit(text));
        System.out.println("验证结果: " + verify(text, encrypt(text)));
    }
}
